package main

import "fmt"

//函数类型

//有名函数定义，函数名是 add
//add 类型是函数字面量类型 func (int, int) int
func add(a, b int) int {
	return a + b
}

//函数声明语句，用于GO代码调用汇编代码
//func add(int, int) int

//add函数的签名，实际上就是 add 的字面量类型
//func (int, int) int

//匿名函数不能独立存在，常作为函数参数，返回值，或者赋值给某个变量
//匿名函数可以直接显式初始化
//匿名函数的类型也是函数字面量类型 func (int, int) int
//func (a, b int) int {
//
//}

/*----------------------------------------------------------------------------------------*/

//新定义函数类型 ADD
//ADD 底层类型是函数字面量类型 func (int, int) int
type ADD func(int, int) int

//add 和 ADD 的底层类型相同，并且 add 是字面量类型
var g ADD = add

func main() {
	f := func(a, b int) int {
		return a + b
	}
	fmt.Println(g(1, 2))
	fmt.Println(f(1, 2))

	//f 和 add 的函数签名相同 func(int, int) int
	fmt.Printf("%T\n", f)
	fmt.Printf("%T\n", add)
	//main.ADD
	fmt.Printf("%T\n", g)
}

//函数类型的意义
//1、	函数也是一种类型，可在函数字面量类型的基础上定义一种命名函数类型
//2、	有名函数和匿名函数的函数签名与命名函数类型的底层类型相同时，它们之间可以进行类型转换
//3、	可以为有名函数类型添加方法   、、、、、、	装饰设计模式
//4、	为有名函数类型添加方法，可以使其和接口打通，为函数到接口的转换开启了大门
